package com.ztr.conversion.word2img;

import com.aspose.words.Document;
import com.aspose.words.ImageSaveOptions;
import com.aspose.words.SaveFormat;
import com.google.common.collect.Lists;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.util.List;

/**
 * <p>
 * Word 转 JPEG 工具类
 * </p>
 */
@Slf4j
public class Word2JpegUtil {


    /**
     * 将Word文档的字节流转换为JPEG图片的字节流列表。
     * 此方法通过Aspose Words库将Word文档的每一页转换为JPEG图片。
     *
     * @param wordBytes Word文档的字节流。
     * @return 包含每一页Word文档转换后的JPEG图片字节流的列表。
     * @throws Exception 如果转换过程中发生错误。
     */
    @SneakyThrows(Exception.class)
    public static List<byte[]> wordBytes2JpegBytes(byte[] wordBytes) {
        // 初始化Aspose Words的文档对象，传入Word文档的字节流。
        Document doc = new Document(new ByteArrayInputStream(wordBytes));

        // 设置图像保存选项，指定保存格式为JPEG，并配置分辨率和其他输出选项。
        ImageSaveOptions iso = new ImageSaveOptions(SaveFormat.JPEG);
        iso.setResolution(128); // 设置图片分辨率
        iso.setPrettyFormat(true); // 设置输出格式化的选项
        iso.setUseAntiAliasing(true); // 启用抗锯齿

        // 初始化存储转换后JPEG图片的列表
        List<byte[]> jpegList = Lists.newArrayList();

        // 遍历文档的每一页，将每一页转换为JPEG图片
        for (int i = 0; i < doc.getPageCount(); i++) {
            // 设置当前要保存的页码
            iso.setPageIndex(i);

            // 使用ByteArrayOutputStream来存储转换后的图片字节流
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

            // 将当前页保存到指定的输出流中，保存格式为JPEG
            doc.save(outputStream, iso);

            // 将转换后的JPEG图片字节流添加到列表中
            jpegList.add(outputStream.toByteArray());
        }

        // 返回包含所有转换后的JPEG图片字节流的列表
        return jpegList;
    }


    /**
     * 将Word文档的字节流转换为JPEG图片文件列表。
     * 使用Aspose库解析Word文档字节流，并将每一页转换为JPEG图片。
     * 每页图片的文件名基于图片根路径和页码生成。
     *
     * @param wordBytes   Word文档的字节流。
     * @param imgRootPath 图片保存的根路径。
     * @return 包含所有转换后的JPEG图片文件的列表。
     * @throws Exception 如果转换过程中发生错误。
     */
    @SneakyThrows(Exception.class)
    public static List<File> wordBytes2JpegFileList(byte[] wordBytes, String imgRootPath) {
        // 初始化文档对象，传入Word文档的字节流。
        Document doc = new Document(new ByteArrayInputStream(wordBytes));
        // 初始化图片保存选项，指定保存格式为JPEG。
        ImageSaveOptions iso = new ImageSaveOptions(SaveFormat.JPEG);
        // 设置图片分辨率。
        iso.setResolution(128);
        // 设置输出图片的格式是否美观。
        iso.setPrettyFormat(true);
        // 设置是否使用抗锯齿。
        iso.setUseAntiAliasing(true);

        // 初始化保存后的图片文件列表。
        List<File> jpegList = Lists.newArrayList();
        // 遍历文档的每一页。
        for (int i = 0; i < doc.getPageCount(); i++) {
            // 构建当前页图片的文件路径。
            String imgPath = imgRootPath + "/" + (i + 1) + ".jpg";
            // 设置当前页码，以便保存当前页的图片。
            iso.setPageIndex(i);
            // 将当前页保存到指定路径。
            doc.save(imgPath, iso);
            // 将保存后的图片文件添加到列表。
            jpegList.add(new File(imgPath));
        }

        // 返回保存后的图片文件列表。
        return jpegList;
    }


}
